﻿using System;

namespace PropertyExpression.TypedSqlBuilder
{
    public static class Query
    {
        public static ITuple<T1, T2, T3> To<T1, T2, T3>(this T1 item1, T2 item2, T3 item3)
        {
            throw new NotImplementedException();
        }

        public static ITuple<T1, T2> To<T1, T2>(this T1 item1, T2 item2)
        {
            throw new NotImplementedException();
        }

        public static ISelect<TEntity> Select<TEntity>()
        {
            throw new NotImplementedException();
        }

        public static IWhere Where(this IValue<bool> value)
        {
            throw new NotImplementedException();
        }

        public static ITable<TEntity> Table<TEntity>()
        {
            throw new NotImplementedException();            
        }

        public static IFrom<TSelectEntity> From<TEntity, TSelectEntity>(
            this ITable<TEntity> table,
            Func<IRow<TEntity>, ISelect<TSelectEntity>> select)
        {
            throw new NotImplementedException();
        }

        public static IFrom<TSelectEntity> From<TEntity, TSelectEntity>(
            this ITable<TEntity> table,
            Func<IRow<TEntity>, ITuple<IWhere, ISelect<TSelectEntity>>> func)
        {
            throw new NotImplementedException();
        }

        public static IFrom<TSelectEntity> From<TEntity, TSelectEntity>(
            this ITable<TEntity> table,
            Func<IRow<TEntity>, IJoin<TSelectEntity>> innerJoin)
        {
            throw new NotImplementedException();
        }

        public static INullableFrom<TSelectEntity> From<TEntity, TSelectEntity>(
            this ITable<TEntity> table,
            Func<INullableRow<TEntity>, INullableJoin<TSelectEntity>> innerJoin)
        {
            throw new NotImplementedException();
        }

        public static IInnerJoin<TSelectEntity> InnerJoin<TEntity, TSelectEntity>(
            this ITable<TEntity> table,
            Func<IRow<TEntity>, ITuple<IValue<bool>, ISelect<TSelectEntity>>> func)
        {
            throw new NotImplementedException();
        }

        public static IInnerJoin<TSelectEntity> InnerJoin<TEntity, TSelectEntity>(
            this ITable<TEntity> table,
            Func<IRow<TEntity>, ITuple<IValue<bool>, IWhere, ISelect<TSelectEntity>>> func)
        {
            throw new NotImplementedException();
        }

        public static IInnerJoin<TSelectEntity> InnerJoin<TEntity, TSelectEntity>(
            this ITable<TEntity> table,
            Func<IRow<TEntity>, ITuple<IValue<bool>, IJoin<TSelectEntity>>> func)
        {
            throw new NotImplementedException();
        }

        public static IInnerJoinTable<TEntity> InnerJoin<TEntity>(
            this ITable<TEntity> table)
        {
            throw new NotImplementedException();
        }

        public static IInnerJoin<TSelectEntity> SelectMany<TEntity1, TEntity2, TSelectEntity>(
            this ITable<TEntity1> table1,
            Func<IRow<TEntity1>, IInnerJoinTable<TEntity2>> table2Func,
            Func<IRow<TEntity1>, IRow<TEntity2>, ITuple<IValue<bool>, IJoin<TSelectEntity>>> func)
        {
            throw new NotImplementedException();
        }

        public static IInnerJoin<TSelectEntity> Select<TEntity, TSelectEntity>(
            this IInnerJoinTable<TEntity> table,
            Func<IRow<TEntity>, ITuple<IValue<bool>, IWhere, ISelect<TSelectEntity>>> func)
        {
            throw new NotImplementedException();
        }

        public static INullableInnerJoin<TSelectEntity> InnerJoin<TEntity, TSelectEntity>(
            this ITable<TEntity> table,
            Func<INullableRow<TEntity>, ITuple<IValue<bool>, INullableJoin<TSelectEntity>>> func)
        {
            throw new NotImplementedException();
        }

        public static ILeftOuterJoin<TSelectEntity> LeftOuterJoin<TEntity, TSelectEntity>(
            this ITable<TEntity> table,
            Func<INullableRow<TEntity>, ITuple<IValue<bool>, IWhere, ISelect<TSelectEntity>>> func)
        {
            throw new NotImplementedException();
        }

        public static ILeftOuterJoin<TSelectEntity> LeftOuterJoin<TEntity, TSelectEntity>(
            this ITable<TEntity> table,
            Func<INullableRow<TEntity>, ITuple<IValue<bool>, IJoin<TSelectEntity>>> func)
        {
            throw new NotImplementedException();
        }

        public static IRightOuterJoin<TSelectEntity> RightOuterJoin<TEntity, TSelectEntity>(
            this ITable<TEntity> table,
            Func<IRow<TEntity>, ITuple<IValue<bool>, IJoin<TSelectEntity>>> func)
        {
            throw new NotImplementedException();
        }

        public static IRightOuterJoin<TSelectEntity> RightOuterJoin<TEntity, TSelectEntity>(
            this ITable<TEntity> table,
            Func<IRow<TEntity>, ITuple<IValue<bool>, INullableJoin<TSelectEntity>>> func)
        {
            throw new NotImplementedException();
        }

        public static IRightOuterJoin<TSelectEntity> RightOuterJoin<TEntity, TSelectEntity>(
            this ITable<TEntity> table,
            Func<IRow<TEntity>, ITuple<IValue<bool>, IWhere, ISelect<TSelectEntity>>> func)
        {
            throw new NotImplementedException();
        }
    }
}
